parser grammar AnalexCParser;

options {
  language = Java;
  tokenVocab = AnalexCLexer;
}

@header {
    package practica6;
}

@members {
     private ArrayList<RecognitionException> errors = new ArrayList<RecognitionException>();
     public ArrayList<RecognitionException> getErrors() {
        return errors;
     }
     @Override
     public void reportError (RecognitionException e) {
        String msg = getErrorMessage(e, getTokenNames());
        System.err.println(msg);
        errors.add(e);
     }
}



entrada: funcion* programa_principal;

funcion: cabecera_func cuerpo;
cabecera_func: tipo IDENT parametros;
cuerpo: LLAVE_A instrucciones LLAVE_C;

instrucciones: (regla_while|regla_if|dec_var|asignacion|salir_bucle|imprimir|(llamada_funcion PUNTO_COMA)|regla_for)*;

programa_principal: cabecera_main cuerpo;
cabecera_main: tipo MAIN parametros;

parametros: PARENTESIS_A ((VOID)? | tipo parametro (COMA tipo parametro)*) PARENTESIS_C;
parametro: (ASTERISCO? IDENT CORCHETES*) | CADENA | NUMERO;

tipo: INT|CHAR|FLOAT|VOID;

dec_var: tipo IDENT (COMA IDENT)* PUNTO_COMA;
asignacion: IDENT IGUAL (expr|caracter|llamada_funcion|condicional_aritm) PUNTO_COMA;
caracter: COMILLA LETRA COMILLA;

regla_while: WHILE condicion cuerpo;
condicion: NOT? PARENTESIS_A comparacion PARENTESIS_C ((AND|OR) NOT? PARENTESIS_A comparacion PARENTESIS_C)*;
comparacion: expr COMPARADOR expr;

expr: CAMBIO_SIGNO? (NUMERO|(IDENT)) (OPERADOR CAMBIO_SIGNO? (NUMERO|(IDENT)))*;

imprimir: PRINTF PARENTESIS_A CADENA (COMA IDENT)* PARENTESIS_C PUNTO_COMA;
salir_bucle: BREAK PUNTO_COMA;
llamada_funcion: IDENT PARENTESIS_A (parametro (COMA parametro)*)? PARENTESIS_C;

regla_if: IF condicion cuerpo;

condicional_aritm: comparacion INTERROGANTE expr DOS_PUNTOS expr PUNTO_COMA;

regla_for: FOR PARENTESIS_A iteracion_for PARENTESIS_C cuerpo;
iteracion_for: ((INT? asignacion)|PUNTO_COMA) comparacion? PUNTO_COMA (incremento|decremento)?;
//pos_vector: CORCHETES;
incremento: PARENTESIS_A? IDENT PARENTESIS_C? INCREMENTO;
decremento: PARENTESIS_A? IDENT PARENTESIS_C? DECREMENTO;